<?php

/**
 * Quản lý phân quyền truy xuất hệ thống
 *
 * @version $Rev:$
 * @license
 */
class Admin_AuthorizationController extends Zend_Controller_Action
{

    public function init()
    {
        $this->params = $this->getRequest()->getParams();
        System_Template::using('blank','Admin');
        parent::init();
    }
    /**
    *   Trang xem phân quyền
    */
    public function indexAction()
    {
        $code = "guest";
        $resources = $this->getList();
        config::set('sourcesDescription.ini',"",$resources);
        
        $table = new System_Table_Roles();
        $select = $table->select();
        $select->from($table,array('NAME','CODE'));
        $list = $table->fetchAll($select);
        $sD = config::getSourcesDescription();
        $data = $sD->module->toArray();

        $authContent = config::getAuth();
        if(isset($this->params['code'])){
            $code = $this->params['code'];
        }
        $this->view->authContent = $authContent;
        $this->view->data = $data;
        $this->view->roles = $list;
        $this->view->code = $code;
        common::showButton('save');
        common::showButton('back');
    }
    
    /**
    * Lưu thiết lập phân quyền
    */
    public function saveAction(){
        $array = config::getAuth();
        //var_dump($this->params['ADMIN']);exit;
        while ($fruit_name = current($array)) {
            $module = key($array);
            $modUp  = strtoupper($module);
            if(isset($this->params[$modUp])){
                $arr = $this->params[$modUp];
                config::updatePermission($this->params['code'],$module,$arr);
            }
            next($array);
        }
        $this->_redirect("/admin/authorization/index");
    }
    
    
    public function getList() {
        $module_dir = $this->getFrontController()->getControllerDirectory();
        $resources = array();
        $ii = 0;
        foreach($module_dir as $dir=>$dirpath) {
            // định dạng lại đường dẫn cho đúng kiểu
            $dirpath = common::formatPath($dirpath,"/");
            $foreachInfo = explode("/",$dirpath);
            $foreachModule = $foreachInfo[count($foreachInfo)-2];
            
            try{
                $diritem = new DirectoryIterator($dirpath);
                foreach($diritem as $item) {
                    $filePath = $dirpath.'/'.$item->getFilename();
                    $filePath = common::formatPath($filePath,"/");
                    if($item->isFile() && file_exists($filePath)) {
                        if(strstr($item->getFilename(),'Controller.php')!=FALSE) {
                          include_once $filePath;
                        }
                    }
                }
            }catch (Exception $ex){
                continue;
            }
            /**
            * Duyệt qua tất cả các class và chỉ lấy thông tin của các class Controller 
            * @name $c : Tên của lớp bỏ đi chữ Controller phía sau
            * @name $arrCurrentInfo : Thông tin module, controller tại thời điểm vòng lặp đọc được
            * @name $zRC : Khai báo Zend_Reflection_Class để lấy đoạn docblock cho class
            */
            $i = 0;
            $resource = array();
            foreach(get_declared_classes() as $class){
                if(is_subclass_of($class, 'Zend_Controller_Action')) {
                    $c = strtolower(substr($class,0,strpos($class,"Controller")));
                    $arrCurrentInfo = explode("_",$c);
                    
                    // nếu mảng chỉ có 1 phần tử, thì module là default
                    if(count($arrCurrentInfo) == 1){
                        $module = "default";
                        $controller = $arrCurrentInfo[0];
                    }else{
                        $module = $arrCurrentInfo[0];
                        $controller = $arrCurrentInfo[1];
                    }
                    // Loại trừ việc đọc nhầm lẫn các module, bằng cách chỉ đọc khi module hiện tại đúng với module đã duyệt qua bên trên
                    if($foreachModule == $module){
                        $functions = array();
                        $zRC = new Zend_Reflection_Class($class);

                        try{
                            $classDescription = $zRC->getDocblock()->getShortDescription();
                        }catch(Exception $ex) {
                            $classDescription = $class;
                        }
                        
                        // lấy danh sách phương thức bên trong lớp
                        foreach(get_class_methods($class) as $method) {
                            if(strstr($method, 'Action')!=false) {
                                $method_r = $zRC->getMethod($method);
                                $actionName = substr($method,0,strpos($method,"Action"));
                                try{
                                    $docblockObject = $method_r->getDocblock();
                                    $shortDescription = $docblockObject->getShortDescription();
                                    
                                    $actionDetail = array(
                                        "NAME"=>$actionName,
                                        "DESCRIPTION"=>$shortDescription
                                    );
                                }catch(Exception $ex)
                                {
                                    $actionDetail = array(
                                        "NAME"=>$actionName,
                                        "DESCRIPTION"=>$actionName
                                    );
                                }
                                array_push($functions,$actionDetail);
                            }
                        }
                        $resource[$i]['DESCRIPTION'] = $classDescription;
                        $resource[$i]['CONTROLLER'] = $controller;
                        $resource[$i]['ACTIONS'] = $functions;
                        $i++;
                    }
                }
            }
            $resources[$ii]['MODULE'] = $dir;
            $resources[$ii]['CONTENT'] = $resource;
            $ii++;
        }
        return $resources;

    }
}

